import axios, { AxiosInstance, AxiosResponse, AxiosError, AxiosRequestConfig } from "axios";

type Response<T = any> = {
    massage?: string;
    code: number;
    data: T;
};

const instance: AxiosInstance = axios.create({
    /** 如果是使用的CORS处理跨域，这里应该设置为  http://127.0.0.1:81 */
    /** 我们这里使用的是Proxy处理跨域，所以设置为 /api 来匹配跨域规则即可  */
    baseURL: "/api",
    timeout: 5000,
    headers: {
        // 'Content-Type': 'application/json',
        Authorization: "token" /** 假设一下 ，假的，没用 */,
    },
    // `transformRequest` 允许在向服务器发送前，修改请求数据
    // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
    // 后面数组中的函数必须返回一个字符串，或 ArrayBuffer，或 Stream
    // transformRequest: [function (data) {
    //   // 对 data 进行任意转换处理
    //   return Qs.stringify(data);
    // }],
});

//你可以放心的进行全局配置 ，非常方便，为后续完善项目做准备

//请求拦截
//就是你请求接口的时候，我会先拦截下来，对你的数据做一个判断，或者携带个token给你
instance.interceptors.request.use(
    (config) => {
        //请求的数据
        // config.headers = config.headers || {}; // 没有数据的话就设置为空设置为数据
        // if (localStorage.getItem("token")) {
        //     //先确保登录
        //     config.headers.token = localStorage.getItem("token") || "";
        // }

        if (config.method === "POST" || config.method === "PUT") {
        }
        return config; //必须返回出去，不然请求发不出去
    },
    (error) => {
        //处理错误请求
        return Promise.reject(error);
    }
);

//响应拦截：后端返回来的结果
instance.interceptors.response.use(
    (res: AxiosResponse) => {
        const code: number = res.data.code; //code是后端的状态码
        if (code !== 200) {
            //请求失败（包括token失效，302，404...根据和后端约定好的状态码做出不同的处理）
            return Promise.reject(res);
        } else {
            //请求成功
            return Promise.resolve(res.data);
        }
    },
    (err: AxiosError) => {
        console.log(err, "错误信息的处理"); //错误信息的处理
        //处理错误响应
        return Promise.reject(err);
    }
);

export default <T>(config: AxiosRequestConfig) => {
    return new Promise<Response<T>>((res, rej) => {
        instance
            .request<Response<T>>(config)
            .then((response) => {
                res(response.data);
            })
            .catch((err: any) => {
                rej(err);
            });
    });
};
